package cn.tedu.file;

import java.io.*;
import java.util.Scanner;

/**本类用于炼制IO综合联系之文件复制案例*/
public class TestCopyFile {
    public static void main(String[] args) {
        //1.提示并接受用户输入的两个路径
        System.out.println("请输入源文件路径：");
        String f = new Scanner(System.in).nextLine();
        System.out.println("请输入新文件路径：");
        String t = new Scanner(System.in).nextLine();



        //2.调用自己创建好的方法，完成文件的复制
//        ZFCopy(f,t);
        ZJCopy(f,t);
    }

    //本方法使用字节流完成文件的复制
    private static void ZJCopy(String f, String t) {
        //1.定义在整个方法中都生效的局部变量，注意手动初始化，默认值为null
        BufferedInputStream in = null;
        BufferedOutputStream out = null;
        //2.由于代码可能会发生异常，所以需要编写try-catch-finally结构
        try {
            in = new BufferedInputStream(new FileInputStream(f));
            out = new BufferedOutputStream(new FileOutputStream(t));

            int b;
            while ((b = in.read()) != -1){
                out.write(b);
            }
            System.out.println("恭喜您！复制成功");

        }catch (Exception e){
            e.printStackTrace();
            System.out.println("恭喜您！复制失败");
        }finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
    //本方法使用字符流完成文件的复制
    private static void ZFCopy(String f, String t) {
        //1.定义在整个方法中都生效的局部变量，注意手动初始化，默认值为null
        Reader in = null;
        Writer out = null;
        //2.由于代码可能会发生异常，所以需要编写try-catch-finally结构
        try{
            //3.1创建高效字符输入流对象
            in = new BufferedReader(new FileReader(f));

            //3.2创建高效字符输出流对象
            out = new BufferedWriter(new FileWriter(t));

            //4.创建好流对象以后，就可以使用流对象来完成业务了
            //4.1 定义变量用来保存读到的数据
            int b;
            //4.2循环读取源文件，直到返回值-1 说明没数据了，就结束循环
            while ((b = in.read()) != -1){
                //4.3将本轮循环读取到写入的新文件中
                out.write(b);
            }
            System.out.println("恭喜您！文件复制成功");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("很抱歉！文件复制失败！");
        }finally {
            /**1.关流是有顺序的，如果有多个流，最后创建的要最先关闭
             * 2.多条关流语句需要各自try-catch，不能放一起，必须分开*/
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }





    }


}
